/* 
 * Copyright (c) 2007, Andrey Shchekin

 * All rights reserved.

 * Redistribution and use in source and binary forms, with or without modification, are permitted provided 
 * that the following conditions are met:
 *    Redistributions of source code must retain the above copyright notice, this list of conditions and
 * the following disclaimer.
 *    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
 * the following disclaimer in the documentation and/or other materials provided with the distribution.
 *    Neither the name of the Andrey Shchekin nor the names of other contributors may be used to endorse or 
 * promote products derived from this software without specific prior written permission.

 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace AshMind.ProjectTypes.SqlProject.Tasks
{
    /// <summary>
    ///   Sorts project items in the file order.
    /// </summary>
    /// <remarks>
    ///   Sort algorithm:
    ///     1. For each directory, subdirectory files go before directory files 
    ///     2. Within each directory, files are ordered by name
    ///     3. Subdirectories are ordered by name
    /// </remarks>
    public class SqlSort : Task
    {
        private ITaskItem[] m_files;

        public override bool Execute()
        {
            Array.Sort(this.Files, this.Compare);
            return true;
        }

        private int Compare(ITaskItem left, ITaskItem right)
        {
            // Hacky, vote for https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=276484
            string leftPath = left.ItemSpec.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
            string rightPath = right.ItemSpec.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);

            return StringComparer.OrdinalIgnoreCase.Compare(leftPath, rightPath);
        }

        [Required] [Output]
        public ITaskItem[] Files
        {
            get { return m_files; }
            set { m_files = value; }
        }
    }
}
